﻿#include "printercontrol.h"

PrinterControl::PrinterControl(QObject *parent)
    : QObject{parent}
{
    printerSerial = new QSerialPort();
}

PrinterControl::~PrinterControl()
{

}



void PrinterControl::setConnectParameter(QString _portName, QString _baudRate,
                                         QString _bataBite, QString _parity, QString _stopBite)
{
    setPortName(_portName);
    setBaudRate(_baudRate);
    setDataBite(_bataBite);
    setParity(_parity);
    setStopBite(_stopBite);

    QSerialPort::BaudRate set_BaudRate;
    QSerialPort::DataBits set_DataBite;
    QSerialPort::Parity   set_Parity;
    QSerialPort::StopBits set_StopBite;



    if("115200" == BaudRate()){
        set_BaudRate = QSerialPort::Baud115200;
    }else if("57600" == BaudRate()){
        set_BaudRate = QSerialPort::Baud57600;
    }else if("38400" == BaudRate()){
        set_BaudRate = QSerialPort::Baud38400;
    }else if("19200" == BaudRate()){
        set_BaudRate = QSerialPort::Baud19200;
    }else if("9600" == BaudRate()){
        set_BaudRate = QSerialPort::Baud9600;
    }else if("4800" == BaudRate()){
        set_BaudRate = QSerialPort::Baud4800;
    }else if("2400" == BaudRate()){
        set_BaudRate = QSerialPort::Baud2400;
    }else {
        set_BaudRate = QSerialPort::Baud1200;
    }

    if("8" == DataBite()){
        set_DataBite = QSerialPort::Data8;
    }else if("7" == DataBite()){
        set_DataBite = QSerialPort::Data7;
    }else if("6" == DataBite()){
        set_DataBite = QSerialPort::Data6;
    }else {
        set_DataBite = QSerialPort::Data5;
    }

    if("None" == Parity()){
        set_Parity = QSerialPort::NoParity;
    }else if("Even" == Parity()){
        set_Parity = QSerialPort::EvenParity;
    }else if("Odd" == Parity()){
        set_Parity = QSerialPort::OddParity;
    }else if("Mark" == Parity()){
        set_Parity = QSerialPort::MarkParity;
    }else {
        set_Parity = QSerialPort::SpaceParity;
    }

    if("1" == StopBite()){
        set_StopBite = QSerialPort::OneStop;
    }else if("1.5" == StopBite()){
        set_StopBite = QSerialPort::OneAndHalfStop;
    }else{
        set_StopBite = QSerialPort::TwoStop;
    }

    printerSerial->setPortName(PortName());             // 设置串口的 串口号
    printerSerial->setBaudRate(set_BaudRate);           // 设置串口的 波特率
    printerSerial->setDataBits(set_DataBite);   		// 设置串口的 数据位
    printerSerial->setParity(set_Parity);               // 设置串口的 校验位
    printerSerial->setStopBits(set_StopBite);   		// 设置串口的 停止位

}

void PrinterControl::linkToComputer()
{
    if(printerSerial->open(QIODevice::ReadWrite))
    {
        qDebug()<<"Cpp -- 打印机连接成功";
        setLinkState(true);
    }
    else
    {
        qDebug()<<"Cpp -- 打印机连接失败";
        setLinkState(false);
    }
}

void PrinterControl::printerActive_WH(QString company, QString nameData, QString numberData,
                                   QString knife, QString roller,
                                   QString stress01, QString stress02, QString stress03,
                                   QString fwdknife01, QString fwdknife02, QString fwdknife03,
                                   QString backknife01, QString backknife02, QString backknife03)
{
    QByteArray printResult;

    QString printWordSet = QString::fromLocal8Bit("1B401B6330021B4C1B54001B57000000008001640118");
    // 打印字符设置 [初始化、设置纸张为标签纸、页模式、打印方向从左到右、设置打印区域、刷新缓存]
    QString printMethod = QString::fromLocal8Bit("0C");
    // 打印命令
    QString companySet = QString::fromLocal8Bit("1B2400001D240000");
    // 客户公司名称 位置   [横向 0 位置 纵向 0  位置]
    QString printWord01Set = QString::fromLocal8Bit("1B2400001D243000");
    // 型材名称 位置   [横向 0 位置 纵向 48  位置]
    QString printWord02Set = QString::fromLocal8Bit("1B2400001D246000");
    // 型材编号 位置   [横向 0 位置 纵向 96  位置]
    QString printWord03Set = QString::fromLocal8Bit("1B2400001D249000");
    // 加工参数 位置   [横向 0 位置 纵向 144  位置]

    QString recvQmlCompany = QString("客户名称:%1\n").arg(company);
    // 公司名称 拼接
    QString recvQmlmatterName = QString("型材名称:%1\n").arg(nameData);
    // 打印字符型材名称 拼接
    QString recvQmlmatterNumber = QString("型材编号:%1\n").arg(numberData);
    // 打印字符型材编号 拼接
    QString parameterTitle = QString("加工参数  --->\n");
    // 打印字符参数标题

    // 将接收到的字符串转换为 16位GBK格式
    QString handlCompany = recvQmlCompany.toLocal8Bit().toHex();

    QString handleMatterName = recvQmlmatterName.toLocal8Bit().toHex();

    QString handlematterNumber = recvQmlmatterNumber.toLocal8Bit().toHex();

    QString handleparameterTitle = parameterTitle.toLocal8Bit().toHex();

    // 将接收到的数据进行拼接
    QString recvParameter = QString("%1,%2,%3,%4,%5,%6,%7,%8,%9,%10,%11")
                                .arg(knife).arg(roller)
                                .arg(stress01).arg(stress02).arg(stress03)
                                .arg(fwdknife01).arg(fwdknife02).arg(fwdknife03)
                                .arg(backknife01).arg(backknife02).arg(backknife03);

    // 将接收到的数据转换为 16位UTF-8格式
    QString handleParameter = recvParameter.toUtf8().toHex();
    // 获取字符串长度
    int parameterLength = QString::number(handleParameter.size() / 2).toInt();
    // 将字符串长度转换为16进制
    QString QR_ParameterLength = QString("%1").arg(parameterLength,2,16,QLatin1Char('0'));
    // 设置打印二维码的位置，匹配打印长度
    QString printerQRCodeSet = QString::fromLocal8Bit("1B24C8001D2482001B5A000005%1%2").arg(QR_ParameterLength).arg("00");

    // 打印指令拼接
    printResult = printWordSet.toUtf8() +
                  companySet.toUtf8() +  handlCompany.toUtf8() +
                  printWord01Set.toUtf8() + handleMatterName.toUtf8() +
                  printWord02Set.toUtf8() + handlematterNumber.toUtf8() +
                  printWord03Set.toUtf8() + handleparameterTitle.toUtf8() +
                  printerQRCodeSet.toUtf8() + handleParameter.toUtf8() +
                  printMethod.toUtf8();
    QByteArray sendMasage = QByteArray::fromHex(printResult);



    if(printerSerial->write(sendMasage))	// 使用串口写入数据
    {
        qDebug()<<"发送成功";
    }
    else
    {
        qDebug()<<"发送失败";
    }
}

void PrinterControl::printerActive_RG(QString company, QString nameData, QString numberData,
                                      QString knife, QString roller, QString stress01, QString stress02, QString stress03,
                                      QString fwdknife01, QString fwdknife02, QString fwdknife03,
                                      QString backknife01, QString backknife02, QString backknife03)
{
    QByteArray printResult;

    QString printerMechineSet = QString::fromLocal8Bit("1B401B63001B732B40");
    // 打印机设置 [初始化,禁止反向打印,加深]

    QString printWordSet = QString::fromLocal8Bit("1B2400001B57010D");
    // 文字打印位置设置 [第一行位置 00 00 ， 放大倍数 1 倍]
    QString printMethod = QString::fromLocal8Bit("1B69");
    // 打印并走纸到下一个标签首

    // 将接收到的数据进行拼接
    QString recvParameter = QString("%1,%2,%3,%4,%5,%6,%7,%8,%9,%10,%11")
                                .arg(knife).arg(roller)
                                .arg(stress01).arg(stress02).arg(stress03)
                                .arg(fwdknife01).arg(fwdknife02).arg(fwdknife03)
                                .arg(backknife01).arg(backknife02).arg(backknife03);

    // 将接收到的数据转换为 16位UTF-8格式
    QString handleParameter = recvParameter.toUtf8().toHex();
    // 获取字符串长度
    int parameterLength = QString::number(handleParameter.size() / 2).toInt();
    // 将字符串长度转换为16进制
    QString QR_ParameterLength = QString("%1").arg(parameterLength,2,16,QLatin1Char('0'));

    QString QR_print = QString::fromLocal8Bit("1D6CDC0050001D57041D6E200601%1%2").arg(handleParameter).arg("00");
    // 二维码打印设定 [设置打印位置 横向220 竖向80 , 二维码放大倍数 04 , 二维码打印内容]

    QString recvQmlCompany = QString("客户名称:%1\n").arg(company);
    // 公司名称 拼接
    QString recvQmlmatterName = QString("型材名称:%1\n").arg(nameData);
    // 打印字符型材名称 拼接
    QString recvQmlmatterNumber = QString("型材编号:%1\n").arg(numberData);
    // 打印字符型材编号 拼接
    QString parameterTitle = QString("加工参数 --->\n");
    // 打印字符参数标题

    // 将接收到的字符串转换为 16位GBK格式
    QString handlCompany = recvQmlCompany.toLocal8Bit().toHex();

    QString handleMatterName = recvQmlmatterName.toLocal8Bit().toHex();

    QString handlematterNumber = recvQmlmatterNumber.toLocal8Bit().toHex();

    QString handleparameterTitle = parameterTitle.toLocal8Bit().toHex();


    // 打印指令拼接
    printResult = printerMechineSet.toUtf8() +
                  QR_print.toUtf8() +
                  printWordSet.toUtf8() +
                  handlCompany.toUtf8() +
                  handleMatterName.toUtf8() +
                  handlematterNumber.toUtf8() +
                  handleparameterTitle.toUtf8() +
                  printMethod.toUtf8();

    // qDebug()<<"最终打印结果:  "<<printResult;


    QByteArray sendMasage = QByteArray::fromHex(printResult);

    if(printerSerial->write(sendMasage))	// 使用串口写入数据
    {
        qDebug()<<"发送成功";
    }
    else
    {
        qDebug()<<"发送失败";
    }
}

bool PrinterControl::linkState() const
{
    return m_linkState;
}

void PrinterControl::setLinkState(bool newLinkState)
{
    if (m_linkState == newLinkState)
        return;
    m_linkState = newLinkState;
    emit linkStateChanged();
}

QString PrinterControl::PortName() const
{
    return m_PortName;
}

void PrinterControl::setPortName(const QString &newPortName)
{
    if (m_PortName == newPortName)
        return;
    m_PortName = newPortName;
    emit PortNameChanged();
}

QString PrinterControl::BaudRate() const
{
    return m_BaudRate;
}

void PrinterControl::setBaudRate(const QString &newBaudRate)
{
    if (m_BaudRate == newBaudRate)
        return;
    m_BaudRate = newBaudRate;
    emit BaudRateChanged();
}

QString PrinterControl::DataBite() const
{
    return m_DataBite;
}

void PrinterControl::setDataBite(const QString &newDataBite)
{
    if (m_DataBite == newDataBite)
        return;
    m_DataBite = newDataBite;
    emit DataBiteChanged();
}

QString PrinterControl::Parity() const
{
    return m_Parity;
}

void PrinterControl::setParity(const QString &newParity)
{
    if (m_Parity == newParity)
        return;
    m_Parity = newParity;
    emit ParityChanged();
}

QString PrinterControl::StopBite() const
{
    return m_StopBite;
}

void PrinterControl::setStopBite(const QString &newStopBite)
{
    if (m_StopBite == newStopBite)
        return;
    m_StopBite = newStopBite;
    emit StopBiteChanged();
}
